import { defineStore } from "pinia";

/**
 * 时间轴数据管理仓库
 */
const timeAxisStore = defineStore("timeAxis", {
  state: () => ({
    // 是否显示时间轴
    showTimeAxis: false,
    // 播放控制器
    controller: null,
    // 倍速选项列表
    timentervalOptions: [
      { value: 1, label: "1倍" },
      { value: 2, label: "2倍" },
      { value: 4, label: "4倍" },
      { value: 8, label: "8倍" },
      { value: 16, label: "16倍" },
    ],
    // 开始时间（秒）
    startTime: 0,
    // 结束时间（秒）
    endTime: 0,
    // 每大刻度间隔时间（秒）
    interval: 12,
    // 每个大刻度之间的小刻度数
    smallInterval: 5,
    // 时间轴参数
    timelineParameters: {},
    // 当前是否在播放
    curIsPlay: false,
    // 当前播放倍速
    timeIntervalValue: 1,
    // 时间轴数据列表
    timeList: [],
    // 当前选择的日期
    currentDate: "",
    // 历史当前数据
    historyCurrentDate: {},
  }),
  
  actions: {
    /**
     * 设置时间轴显示状态
     */
    setShowTimeAxis(value: boolean): void {
      this.showTimeAxis = value;
    },
    
    /**
     * 更新时间变化参数
     */
    timeChange(value: any): void {
      this.timelineParameters = value;
    },
    
    /**
     * 将毫秒时间戳转换为秒
     */
    convertTimestampToSeconds(timestamp: number): number {
      return Math.floor(timestamp / 1000);
    },
    
    /**
     * 清除时间轴数据
     */
    clearTimeAxis(): void {
      this.startTime = 0;
      this.endTime = 0;
      this.curIsPlay = false;
      this.timelineParameters = {};
    },
    
    /**
     * 设置时间轴的开始和结束时间
     */
    setTime(value: { startTime: number; endTime: number }): void {
      this.startTime = this.convertTimestampToSeconds(value.startTime);
      this.endTime = this.convertTimestampToSeconds(value.endTime);
      
      // 计算时间总跨度
      const totalDuration = this.endTime - this.startTime;
      
      // 计算跨天天数
      const startDate = new Date(this.startTime * 1000);
      const endDate = new Date(this.endTime * 1000);
      const daysDiff = Math.floor((endDate - startDate) / (24 * 60 * 60 * 1000));
      
      // 根据跨天情况选择合适的间隔
      this.calculateTimeInterval(totalDuration, daysDiff);
      
      // 更新当前日期
      if (value.startTime) {
        this.currentDate = new Date(value.startTime).toDateString();
      }
    },
    
    /**
     * 计算合适的时间间隔
     */
    calculateTimeInterval(totalDuration: number, daysDiff: number): void {
      if (daysDiff > 1) {
        // 跨天的情况
        if (daysDiff <= 3) {
          this.interval = 3600 * 6; // 6小时间隔
        } else if (daysDiff <= 7) {
          this.interval = 3600 * 12; // 12小时间隔
        } else if (daysDiff <= 14) {
          this.interval = 3600 * 24; // 1天间隔
        } else if (daysDiff <= 30) {
          this.interval = 3600 * 24 * 2; // 2天间隔
        } else {
          this.interval = 3600 * 24 * 5; // 5天间隔
        }
        
        // 跨天情况下减少小刻度数量
        this.smallInterval = 2;
      } else {
        // 不跨天或跨1天的情况
        if (totalDuration <= 300) { // 5分钟以内
          this.interval = 15; // 15秒间隔
        } else if (totalDuration <= 900) { // 15分钟以内
          this.interval = 30; // 30秒间隔
        } else if (totalDuration <= 1800) { // 30分钟以内
          this.interval = 60; // 1分钟间隔
        } else if (totalDuration <= 3600) { // 1小时以内
          this.interval = 300; // 5分钟间隔
        } else if (totalDuration <= 7200) { // 2小时以内
          this.interval = 600; // 10分钟间隔
        } else if (totalDuration <= 14400) { // 4小时以内
          this.interval = 900; // 15分钟间隔
        } else if (totalDuration <= 43200) { // 12小时以内
          this.interval = 1800; // 30分钟间隔
        } else {
          this.interval = 3600; // 1小时间隔
        }
        
        // 非跨天情况下使用标准小刻度数量
        this.smallInterval = 5;
      }
    },
    
    /**
     * 设置播放状态
     */
    setCurIsPlay(value: boolean): void {
      this.curIsPlay = value;
    },
    
    /**
     * 添加新的架次数据
     */
    addTimeData(data: { id: string; data: any[]; timestamp: number }): void {
      // 获取数据的日期
      const dataDate = new Date(data.timestamp).toDateString();
      
      // 如果日期不同，清除之前的数据
      if (this.currentDate && this.currentDate !== dataDate) {
        // 清除数据
        this.clearTimeAxis();
        
        // 更新日期
        this.currentDate = dataDate;
      }
      
      // 添加新数据
      this.timeList.push({...data});
    },
  },
});

export default timeAxisStore;
